package org.ithang.tools.util;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class DateUtils {
	
	public static DateTimeFormatter dayNumFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
	public static DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
	public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

	
	public static String fmtDate(LocalDate date) {
        return date.format(dateFormatter);
	}
	
	public static String fmtDateTime(LocalDateTime dateTime) {
        return dateTime.format(dateTimeFormatter);
	}
	
	public static LocalDateTime parseDateTime(String dateTime) {
		return LocalDateTime.parse(dateTime, dateTimeFormatter);
	}
	
	public static LocalDate parseDate(String dateTime) {
		return LocalDate.parse(dateTime,dateFormatter);
	}
	
	public static String getSystime() {
		LocalDateTime now = LocalDateTime.now();
        return now.format(dateTimeFormatter);
	}
	
	public static String today() {
		LocalDate now = LocalDate.now();
        return now.format(dateFormatter);
	}
	
	/**
	 * 天数格式化为数字字符串
	 * @param dayNum
	 * @return
	 */
	public static String dayNum(int dayNum) {
		LocalDate day = LocalDate.now().plusDays(dayNum);
        return day.format(dayNumFormatter);
	}
	
	/**
	 * 昨天
	 * @return
	 */
	public static String lastDay() {
        return otherDay(-1);
	}
	
	/**
	 * 前几天
	 * @param dayNum
	 * @return
	 */
	public static String otherDay(int dayNum) {
		LocalDate lastDate = LocalDate.now().plusDays(dayNum);
        return lastDate.format(dateFormatter);
	}
	
	/**
	 * 把AD中的时间格式化一下
	 * 在Active Directory中，有些时间属性值（例：LastLogon）通常是一个64位整数，表示自1601年1月1日（UTC）以来的100纳秒间隔数。
	 * 为了将这个值转换为Java中的日期时间格式，
	 * 你需要先将其转换为毫秒，然后使用Java 8或更高版本的java.time包来处理
	 * @param adTime
	 * @return
	 */
	public static String fmtADTime(String adTime) {
		try {
			if(null!=adTime&&adTime.trim().length()>0) {
				adTime=adTime.trim();
				long lastLogonValue =Long.parseLong(adTime); // 示例值
		        // AD的LastLogon是100纳秒单位，需要转换为毫秒
		        long lastLogonMillis = (lastLogonValue / 10000) - 11644473600000L; // 减去从1601到1970的时间差
		        // 转换为Instant对象
		        Instant lastLogonInstant = Instant.ofEpochMilli(lastLogonMillis);
		        ZoneId shanghaiZone = ZoneId.of("Asia/Shanghai");
		        // 使用DateTimeFormatter进行进一步格式化
		        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
		                                                      .withZone(shanghaiZone);
		        // 格式化输出
		        String formattedLastLogon = formatter.format(lastLogonInstant);
	            return formattedLastLogon;
			}
		}catch(Exception e) {
			log.error("格式化时间{}出错",adTime,e);
			e.printStackTrace();
		}
		return adTime;//如果格式化失败，则返回原数据
	}
	
	public static String getOffsetDateTimeStr(OffsetDateTime time) {
        return time.format(dateTimeFormatter);
	}
	
	public static void main(String[] args) {
		System.out.println(parseDateTime("2025-01-14 09:45:45"));
		System.out.println(new Date().getTime());
		LocalDate start = LocalDate.of(2025, 5, 1);
		LocalDate end = LocalDate.of(2025, 5, 15);
		long days = ChronoUnit.DAYS.between(start, end); 
		System.out.println(days);
		
		
		OffsetDateTime now = OffsetDateTime.now();
        // 注意：mm表示分钟，MM表示月份，ss表示秒
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formatted = now.format(formatter);
        System.out.println(formatted); // 输出如：2025-06-04 15:30:45
		
		
	}
}
